<?php

class CargaRecaudacionesTest extends MY_Controller {

    function __construct() {
        parent::__construct();
    }

    /*
     * index() se ejecuta por defecto al ser cargado del controlador
     */

    public function index() {
        
            // en la base de datos hay socios cargados en 2 zonas (zoa 3 y zona 5) para este mes,suponiendo que todos pagan,
            //los montos correctos serian zona 3 = 1770 y zona 5 = 540
            $i = 0;
            
            $test = $this->validarCargaRecaudacion('0','0','1170','0','540','0','0','0','0','0');
            $test_name = 'Prueba ' . ++$i . ' - Prueba calculo de recaudacion Validacion de montos';
            $expected_result = true;
        
            $this->unit->run($test, $expected_result, $test_name);
            
            $test = $this->validarCargaRecaudacion('0','0','2111','0','540','0','0','0','0','0');
            $test_name = 'Prueba ' . ++$i . ' - Prueba calculo de recaudacion Validacion de montos (montos mal cargados)';
            $expected_result = false;
        
            $this->unit->run($test, $expected_result, $test_name);
            
            $test = $this->validarCargaRecaudacion('0','0','1170','0','540','0','0','0','0','');
            $test_name = 'Prueba ' . ++$i . ' - Prueba calculo de recaudacion Validacion falta cargar zonas';
            $expected_result = false;
        
            $this->unit->run($test, $expected_result, $test_name);
            
            $test = $this->validarCargaRecaudacion('0','0','1170','0','540','0','0','0','0','aaa');
            $test_name = 'Prueba ' . ++$i . ' - Prueba calculo de recaudacion Validacion tipos de dato';
            $expected_result = false;
        
            $this->unit->run($test, $expected_result, $test_name);
            
            $test = $this->validarCargaRecaudacion('-11','0','1170','0','540','0','0','0','0','0');
            $test_name = 'Prueba ' . ++$i . ' - Prueba calculo de recaudacion Validacion montos negativos';
            $expected_result = false;
        
            $this->unit->run($test, $expected_result, $test_name);
            
            
            //Generación Reporte de Ejecución de las Pruebas
           
            echo $this->unit->report();
        
    }
    //se pasan los montos de cada zona $z1 = monto en la zona 1
    private function validarCargaRecaudacion($z1,$z2,$z3,$z4,$z5,$z6,$z7,$z8,$z9,$z10) {
        
        return (( $this->required($z1) &&
                $this->numeric($z1) &&
                $this->max_length($z1, 5) &&
                $this->validar_monto_recaudado($z1, 1) 
                ) 
                &&
                ( $this->required($z2) &&
                $this->numeric($z2) &&
                $this->max_length($z2, 5) &&
                $this->validar_monto_recaudado($z2, 2) )
                 &&
                ( $this->required($z3) &&
                $this->numeric($z3) &&
                $this->max_length($z3, 5) &&
                $this->validar_monto_recaudado($z3, 3) 
                )
                 &&
                ( $this->required($z4) &&
                $this->numeric($z4) &&
                $this->max_length($z4, 5) &&
                $this->validar_monto_recaudado($z4, 4) 
                )
                  &&
                ( $this->required($z5) &&
                $this->numeric($z5) &&
                $this->max_length($z5, 5) &&
                $this->validar_monto_recaudado($z5, 5) )
                 &&
                ( $this->required($z6) &&
                $this->numeric($z6) &&
                $this->max_length($z6, 5) &&
                $this->validar_monto_recaudado($z6, 6) )
                 &&
                ( $this->required($z7) &&
                $this->numeric($z7) &&
                $this->max_length($z7, 5) &&
                $this->validar_monto_recaudado($z7, 7) )
                 &&
                ( $this->required($z8) &&
                $this->numeric($z8) &&
                $this->max_length($z8, 5) &&
                $this->validar_monto_recaudado($z8, 8) )
                &&
                ( $this->required($z9) &&
                $this->numeric($z9) &&
                $this->max_length($z9, 5) &&
                $this->validar_monto_recaudado($z9, 9))
                 &&
                ( $this->required($z10) &&
                $this->numeric($z10) &&
                $this->max_length($z10, 5) &&
                $this->validar_monto_recaudado($z10, 9) )
                
                );
    }

    function numeric($str) {
        return (bool) preg_match('/^[\-+]?[0-9]*\.?[0-9]+$/', $str);
    }
    private function noPagado($cupon) {
        //Obtiene la instancia de CI y establece el mensaje en caso de error.


        $cuponDao = new \CuponDAO();
        return $cuponDao->existeCuponNoPagado($cupon);
    }

    public function cuponOrdenado($str) {


        $cuponDAO = new \CuponDAO();
        $cupon = $cuponDAO->getCuponByID($str);

        $cuponesNoPagadosSocio = $cuponDAO->getCuponesNoPagadosBySocio($cupon->getSocio()->getId());

        foreach ($cuponesNoPagadosSocio as $cuponNoPagado) {

            if ($cuponNoPagado->getFechaVencimiento() > $cupon->getFechaVencimiento())
                return FALSE;
        }

        return TRUE;
    }

    private function notUnique($str, $params) {


        return!$this->unique($str, $params);

    }
        
    private function unique($str, $params) {

        //Obtiene la instancia de CI y establece el mensaje en caso de error.
        $CI = & get_instance();
        $CI->form_validation->set_message('unique', 'El %s ya existe en la base de datos.');

        //Separa los 3 parametros en las variables $model, $field y $type.
        list($model, $field, $type) = explode(',', $params, 3);

        //Crea una instancia del parametro $model.
        $instance = new $model();

        //Con esta instancia, llama a la funcion existe del modelo, la cual se
        //encargará de validar si efectivamente el campo es unique. Se le pasa como
        //parametros el valor del campo, el nombre del campo y el tipo (string o
        //integer).
        $yaExiste = $instance->existe($str, $field, $type);

        //Si ya existe, retorna FALSE y la validación falla. Sino retorna TRUE.
        if ($yaExiste) {
        return FALSE;
        } 
        else {
            return TRUE;
        }
    }
    private function cleanQuery($str) {

        //Obtiene la instancia de CI y establece el mensaje en caso de error.
        $CI = & get_instance();
        echo 'entras';

        //Si los caracteres especiales son automáticamente escapados, los "des-escapa".
        if (get_magic_quotes_gpc ()) {
            $str = stripslashes($str);
        }

        //Establece una conexión con la base de datos para obtener la versión de
        //PostgreSQL.
        
        $db_conn = pg_connect("host=localhost port=5432 dbname=MetodosDB user=postgres password=agu123");
        $pg_version = pg_version($db_conn);

        //Si la versión de PHP es mayor o igual a la 4.2.0 y la de PostgreSQL mayor
        //o igual a la 7.2 entonces se puede utilizar pg_escape_string, sino se utiliza
        //addslashes.
        if (phpversion() >= '4.2.0' && $pg_version['client'] >= '7.2') {
            $str = pg_escape_string($str);
        } else {
            $str = addslashes($str);
        }

        //Elimina tags HTML.
        $str = strip_tags($str);

        //Arreglo de palabras no permitidas.
        $invalidKeywords = array('select', 'from', 'where', 'union', 'insert',
            'update', 'join', 'create', 'delete');

        //Por cada palabra del arreglo, determina si aparece en la cadena. En ese caso,
        //retorna FALSE.
        for ($i = 0; $i < count($invalidKeywords); $i++) {
            $injection = stripos($str, $invalidKeywords[$i]);
            if (is_numeric($injection))
                return FALSE;
        }

        //Sino, retorna TRUE.
        return TRUE;
    }
    
    private function max_length($str, $val) {
        if (preg_match("/[^0-9]/", $val)) {
            return FALSE;
        }

        if (function_exists('mb_strlen')) {
            return (mb_strlen($str) > $val) ? FALSE : TRUE;
        }

        return (strlen($str) > $val) ? FALSE : TRUE;
    }

    private function xss_clean($str) {
        $CI = & get_instance();
        
        return $CI->security->xss_clean($str);
    }
    
    private function required($str) {
        
        
        if (!is_array($str)) {
            return (trim($str) == '') ? FALSE : TRUE;
        } else {
            return (!empty($str));
        }
    }
 private function validar_monto_recaudado($str, $param){
       
        
        $cuponDAO = new \CuponDAO();
        $cuponesNoDevueltosEnZona = $cuponDAO->getCuponesNoDevueltosEnZona($param);
        
        $total = 0;
        if($cuponesNoDevueltosEnZona !== FALSE){
            
            $socioServAd = new \SocioServicioAdicionalDAO();
            
            foreach($cuponesNoDevueltosEnZona as $cuponNoDevuelto){
                
                $total += (int)$cuponNoDevuelto->getSocio()->getCategoria()->getImporte();
                
                $servicios = $socioServAd->getServiciosDeSocio($cuponNoDevuelto->getSocio()->getId(), 
                                                        $cuponNoDevuelto->getSocio()->getCategoria()->getId());
                
                foreach($servicios as $servicio){
                    
                    $total += (int)$servicio['importe'];
                    
                }
                
            }
            
        }
        //echo  'zona: '.$param.'  monto real = :'.$total.'  monto ingresado = '.$str.'</br>';
       
        return ($total == (int)$str);
        
    }
}

?>
